perm filename GUNFAI.FAI[SYS,HE]1 blob
sn#050014 filedate 1973-06-19 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00017 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 FAISUM
C00004 00003 FAISUM CONT.
C00006 00004 SUMINT
C00007 00005 ANGDIR, ANGLE
C00008 00006 SORINT
C00009 00007 SORLOD
C00010 00008 SORBOD
C00012 00009 SORBOD CONT.
C00014 00010 SORBOD CONT.
C00016 00011 SORBOD CONT.
C00018 00012 SORBOD CONT., ANGLEN, LDIST
C00020 00013 DNEW, MALI
C00022 00014 WEIFAI
C00023 00015 LININT
C00024 00016 PLDIS
C00026 00017 PLDIS CONT.
C00027 ENDMK
C⊗;
; FAISUM
ENTRY FAISUM,SUMINT,ANGDIR,ANGLE,SORINT,SORLOD,SORBOD,ANGLEN
ENTRY LININT,DNEW,WEIFAI,MALI,LDIST,PLDIS
TITLE GUNFAI - FAIL CODE FOR SPEEDING UP GUNLO
P←17;
SAV: BLOCK 20 ;SAVE REGISTERS HERE AS NECESSARY
;FOR SUMS PROCEDURE
EXTERNAL IHI,IHI2,SX,SY,SX2,SY2,SXY,LEKV
E11←0
E21←1
E12←2
E22←3
H←4
H1←5
H2←6
L←7
FAISUM: MOVE [XWD 12,SAV]
BLT SAV+3
MOVE H,IHI ;LOAD REGISTERS WITH POINTERS
MOVE H1,-6(P)
MOVE L,-7(P)
MOVE H2,IHI2
L100:
EAX1: MOVE E11,.(H) ;LOAD COORDINATES - ADDRS SET BY SUMINT
EBX1: MOVE E21,.(H)
EAY1: MOVE E12,.(H)
EBY1: MOVE E22,.(H)
MOVE 10,E11 ;CALCULATE NEXT SET OF VALUES
FADR 10,E21 ;X1+X2
MOVE 11,E12
FADR 11,E22 ;Y1+Y2
MOVE 12,E11
FMPR 12,E11
MOVE 13,E21
FMPR 13,E21
FADR 12,13 ;X1↑2+X2↑2
MOVE 13,E12
FMPR 13,E12
MOVE 14,E22
FMPR 14,E22
FADR 13,14 ;Y1↑2+Y2↑2
MOVE 14,E12
FMPR 14,E11
MOVE 15,E21
FMPR 15,E22
FADR 14,15 ;X1*X2+Y1*Y2
; FAISUM CONT.
CAME H,L
JRST L1
MOVEM 10,SX ;FIRST TIME THROUGH-STORE VALUES
MOVEM 11,SY
MOVEM 12,SX2
MOVEM 13,SY2
MOVEM 14,SXY
JUMPL H1,L101 ;MORE POINTS - CONTINUE
MOVE 10,[XWD SAV,12]
BLT 10,15
PUSH P,E11 ;OTHERWISE, GET COEFS. AND RETURN
PUSH P,E12
PUSH P,E21
PUSH P,E22
PUSH P,-11(P) ;ADDRS FOR COEFS. BACK ON STACK
PUSH P,-11(P)
PUSH P,-11(P)
MOVEM H,IHI ;THIS MAY HAVE BEEN CHANGED
PUSHJ P,LEKV
SETZM 1 ;FLAG FOR IMMEDIATE EXIT
POPJ P,
L101: CAMN H,H2
JRST L11 ;WE ARE DONE
AOJA H,L100 ;OTHERWISE, INC POINTER AND RETURN FOR MORE
L1: FADRM 10,SX ;THIS WAS NOT FIRST PAIR, ADD VALUES TO SUMS
FADRM 11,SY
FADRM 12,SX2
FADRM 13,SY2
FADRM 14,SXY
JUMPL H1,L101 ;RETURN FOR MORE POINTS
L11: MOVEM H,IHI ;DONE - EXIT
MOVE 10,[XWD SAV,12]
BLT 10,15
SETOM 1 ;NO IMMEDIATE RETURN
POPJ P,
; SUMINT
SUMINT: MOVE -5(P)
HRRM EAX2
HRRM EAX3
HRRM EAX4
HRRM EAX5
HRRM EAX6
SOS
HRRM EAX1
MOVE -4(P)
HRRM EAY2
HRRM EAY3
HRRM EAY4
HRRM EAY5
HRRM EAY6
SOS
HRRM EAY1
MOVE -3(P)
HRRM EBX2
HRRM EBX3
; HRRM EBX4
HRRM EBX5
HRRM EBX6
HRRM EBX7
HRRM EBX8
HRRM EBX9
SOS
HRRM EBX1
MOVE -2(P)
HRRM EBY2
HRRM EBY3
; HRRM EBY4
HRRM EBY5
HRRM EBY6
HRRM EBY7
HRRM EBY8
HRRM EBY9
HRRM EBY10
HRRM EBY11
SOS
HRRM EBY1
MOVE -1(P)
HRRM LE1
HRRM LE2
HRRM LE3
HRRM LE4
HRRM LE5
HRRM LE6
HRRM LE7
SUB P,[XWD 6,6]
JRST @6(P)
; ANGDIR, ANGLE
EXTERNAL ATAN2,AMOD
ANGDIR: PUSH P,-1(P)
PUSH P,-3(P)
PUSHJ P,ATAN2
FADR 1,[6.2832]
PUSH P,1
PUSH P,[6.2832]
PUSHJ P,AMOD
FMPR 1,[57.29]
CAML 1,[360.0]
SETZM 1
SUB P,[XWD 3,3]
JRST @3(P)
ANGLE: POP P,RET# ;SAVE RETURN ADDR
PUSHJ P,ANGDIR ;ARG ALREADY THERE - WILL REDUCE STACK BY 2
MOVEM 1,TMP# ;SAVE RESULT
PUSHJ P,ANGDIR ;ARG THERE AGAIN - REDUCE STACK BY 2 MORE
MOVNS 1
FADR 1,TMP ;COMBINE
FADR 1,[360.0]
PUSH P,1
PUSH P,[360.0]
PUSH P,RET ;PUT RETURN BACK ON STACK
JRST AMOD ;AMOD WILL RETURN FOR US
; SORINT
SORINT: MOVE -6(P)
HRRM FAX1
HRRM FAX2
HRRM FAX3
HRRM FAX4
HRRM FAX5
HRRM FAX6
MOVE -5(P)
HRRM FAY1
HRRM FAY2
HRRM FAY3
HRRM FAY4
HRRM FAY5
HRRM FAY6
MOVE -4(P)
HRRM FBX1
HRRM FBX2
HRRM FBX3
HRRM FBX4
HRRM FBX5
HRRM FBX6
MOVE -3(P)
HRRM FBY1
HRRM FBY2
HRRM FBY3
HRRM FBY4
HRRM FBY5
HRRM FBY6
MOVE -2(P)
HRRM IFO1
HRRM IFO2
HRRM IFO3
HRRM IFO4
HRRM IFO5
HRRM IFO6
HRRM IFO7
HRRM IFO8
HRRM IFO9
MOVE -1(P)
HRRM IBA1
HRRM IBA2
HRRM IBA3
HRRM IBA4
HRRM IBA5
HRRM IBA6
HRRM IBA7
HRRM IBA8
SUB P,[XWD 7,7]
JRST @7(P)
; SORLOD
EXTERNAL NOEPA
; FOR SORTED - SORINT, SORLOD, SORBOD
SORLOD: SETZM 1
CAML 1,NOEPA
POPJ P,
LE1: SETZM .(1)
FAX1: MOVE 2,.(1)
FBX1: FADR 2,.(1)
FSC 2,-1
EAX2: MOVEM 2,.(1)
FAY1: MOVE 2,.(1)
FBY1: FADR 2,.(1)
FSC 2,-1
EAY2: MOVEM 2,.(1)
MOVE 2,[1000000.]
EBX2: MOVEM 2,.(1)
EBY2: MOVEM 2,.(1)
IFO8: SETOM .(1)
IBA8: SETOM .(1)
AOJA 1,SORLOD+1
X←0
Y←1
IP←1
DX0←2
DY0←3
DXN←4
DYN←5
DX1←6
DY1←7
DXY1←10
DXY2←11
D2←12
NEXT←13
IW←14
T←15
U←16
GRAV: 0
RDEP2: 0
DDQ: 0
FAK: 0
A1: 0
A2: 0
; SORBOD
SORBOD: HRLI 1,-6(P)
HRRI 1,GRAV
BLT 1,A2 ;GET ARGUMENTS
SUB P,[XWD 7,7]
MOVE [XWD 12,SAV]
BLT SAV+4
SOS NOEPA ;REDUCE NOEPA BY ONE FOR TESTING
SETZM IW
LP1: CAML IW,NOEPA
JRST LP1END
EAX3: MOVE X,.(IW) ;GET CENTER POINT AND PAIR-VECTOR
EAY3: MOVE Y,.(IW)
FBX2: MOVE DX0,.(IW)
FAX2: FSBR DX0,.(IW)
FBY2: MOVE DY0,.(IW)
FAY2: FSBR DY0,.(IW)
MOVEI NEXT,1(IW)
LP100: CAMLE NEXT,NOEPA
AOJA IW,LP1
MOVE T,X ;IS NEW PAIR INSIDE WINDOW?
EAX4: FSBR T,.(NEXT)
MOVMS T
CAMLE T,GRAV
AOJA NEXT,LP100
MOVE T,Y
EAY4: FSBR T,.(NEXT)
MOVMS T
CAMLE T,GRAV
AOJA NEXT,LP100
FBX3: MOVE DXN,.(NEXT) ;YES - COMPUTE DIRECTED DISTANCES AND UPDATE
FAX3: FSBR DXN,.(NEXT) ; MINIMA. FIRST FIND VECTOR FOR NEW PAIR
FBY3: MOVE DYN,.(NEXT)
FAY3: FSBR DYN,.(NEXT)
FBX4: MOVE DX1,.(IW)
FAX4: FSBR DX1,.(NEXT)
FMPR DX1,[3.0]
FBX5: FADR DX1,.(NEXT)
FAX5: FSBR DX1,.(IW)
FBY4: MOVE DY1,.(IW)
FAY4: FSBR DY1,.(NEXT)
FMPR DY1,[3.0]
FBY5: FADR DY1,.(NEXT)
FAY5: FSBR DY1,.(IW)
MOVE DXY1,DX1
FMPR DXY1,DXY1
; SORBOD CONT.
MOVE T,DY1
FMPR T,T
FADR DXY1,T ;DXY1←DX1↑2+DY1↑2
MOVE DXY2,DX0
FADR DXY2,DXN
FMPR DXY2,[-4.0]
FADR DXY2,DX1
FMPR DXY2,DXY2
MOVE T,DY0
FADR T,DYN
FMPR T,[-4.0]
FADR T,DY1
FMPR T,T
FADR DXY2,T ;DXY2←(DX1-4*(DX0+DXN))↑2+(DY1-4*(DY0+DYN))↑2
CAMLE DXY1,DDQ ;DIRECTED DISTANCES TOO LARGE?
CAMG DXY2,DDQ
CAIA
AOJA NEXT,LP100
MOVE T,DX0
FADR T,DXN
FMPR T,T
MOVE U,DY0
FADR U,DYN
FMPR U,U
FADR T,U
FMPR T,T
FSBR T,A2 ;D2←1 MAX (A1/(.001 MAX (((DX0+DXN)↑2+
CAMGE T,[0.001] ;(DYO+DYN)↑2)↑2-A2)))
MOVE T,[0.001]
MOVE D2,A1
FDVR D2,T
CAMGE D2,[1.0]
MOVE D2,[1.0]
FMPR D2,D2
FSBR D2,[1.0]
FMPR D2,FAK
FMPR D2,RDEP2 ;D2←RDEP2*FAK*(D2↑2-1)
FADR DXY1,D2
FADR DXY2,D2
CAMLE DXY1,DDQ ;GO THROUGH MINIMUM VALUES AND UPDATE IF NEC.
JRST L101P
EBY5: CAMLE DXY1,.(IW)
JRST L102P
IFO1: MOVEM NEXT,.(IW) ;NEW MINIMUM FOR OLD FORWARD
EBY6: MOVEM DXY1,.(IW)
L102P:
EBX5: CAMLE DXY1,.(NEXT)
JRST L101P
; SORBOD CONT.
IBA1: MOVEM IW,.(NEXT) ;NEW MINIMUM FOR NEW BACKWARD
EBX6: MOVEM DXY1,.(NEXT)
L101P: CAMLE DXY2,DDQ
AOJA NEXT,LP100
EBY7: CAMLE DXY2,.(NEXT)
JRST L103P
IFO2: MOVEM IW,.(NEXT) ;NEW MINIMUM FOR NEW FORWARD
EBY8: MOVEM DXY2,.(NEXT)
L103P:
EBX7: CAMLE DXY2,.(IW)
AOJA NEXT,LP100
IBA2: MOVEM NEXT,.(IW) ;NEW MINIMUM FOR OLD BACKWARD
EBX8: MOVEM DXY2,.(IW)
AOJA NEXT,LP100
AOJA IW,LP1
; AT THIS POINT, ALL EDGE-PAIRS HAVE BEEN EQUIPPED WITH BOTH
; BACKWARD AND FORWARD POINTERS (NOT NECESSARILY RECIPROCATED.)
; CLEAN UP THE LINKAGES, AND BREAK UP LOOPS (ALTHOUGH VERY
; UNLIKELY) AT THEIR WEAKEST LINK
I8←2
WEAK←3
IWEAK←4
ONE←5
TWO←ONE+1
LP1END: SETZM I8
MOVEI ONE,1
LP8: CAMLE I8,NOEPA ;REMEMBER, STILL DEC BY ONE
JRST LP8END
LE7: SKIPE .(I8)
AOJA I8,LP8
SETZM WEAK
MOVEI IW,(I8)
L82:
LE2: MOVEM ONE,.(IW)
IFO3: MOVE NEXT,.(IW)
JUMPL NEXT,L80+1 ;CHAIN CONTINUES?
IBA3: CAME IW,.(NEXT)
JRST L80
EBY9: CAML WEAK,.(IW) ;YES, STEP NEXT
JRST L84
MOVEI IWEAK,(IW) ;NEW MAXIMUM FOR WEAK LINK
EBY10: MOVE WEAK,.(IW)
L84: MOVEI IW,(NEXT)
CAIE IW,(I8) ;DO WE HAVE A LOOP?
JRST L82
; SORBOD CONT.
IFO4: MOVE T,.(IWEAK) ;YES, BREAK AT WEAKEST LINK
IBA4: SETOM .(T)
IFO5: SETOM .(IWEAK)
AOJA I8,LP8
L80:
IFO6: SETOM .(IW) ;NO, THERE IS A BREAK, REVERSE
MOVEI IW,(I8)
L81:
IBA5: MOVE NEXT,.(IW)
JUMPL NEXT,L83+1 ;CHAIN CONTINUES?
IFO7: CAME IW,.(NEXT)
JRST L83
MOVEI IW,(NEXT) ;YES, STEP NEXT
LE3: MOVEM ONE,.(IW)
JRST L81
L83:
IBA6: SETOM .(IW) ;BREAK IN THE BACKWARD LINKAGE-END OF CHAIN
AOJA I8,LP8
; THE FOLLOWING RECOPIES ARRAYS ACCORDING TO CONNECTIVITY
LP8END: SETZM IP
MOVEI TWO,2
SETZM IW
LP5: CAMLE IW,NOEPA
JRST LP5END
IBA7: SKIPL .(IW)
AOJA IW,LP5
MOVEI NEXT,(IW)
LE4: MOVEM ONE,.(IP)
L7:
FAX6: MOVE T,.(NEXT)
EAX5: MOVEM T,.(IP)
FAY6: MOVE T,.(NEXT)
EAY5: MOVEM T,.(IP)
FBX6: MOVE T,.(NEXT)
EBX9: MOVEM T,.(IP)
FBY6: MOVE T,.(NEXT)
EBY11: MOVEM T,.(IP)
IFO9: MOVE NEXT,.(NEXT)
JUMPL NEXT,[AOS IP
AOJA IW,LP5]
LE5: ADDM TWO,.(IP)
AOS IP
LE6: MOVEM TWO,.(IP)
JRST L7
; SORBOD CONT., ANGLEN, LDIST
LP5END: AOS NOEPA ;PUT BACK NOEPA
MOVE [XWD SAV,12]
BLT 16
JRST @7(P)
; COMPUTES ANGLE AND LENGTH FOR LINE LL
EXTERNAL SQRT
ANGLEN: MOVE 6,-1(P) ;LL
MOVEM 6,LL
MOVEI 3,(6)
ASH 3,1 ;IV2
MOVEI 2,-1(3) ;IV2-1
XLC1: MOVE 4,.(3)
XLC2: FSBR 4,.(2) ;DX←XLCOR[IV2]-XLCOR[IV2-1]
YLC1: MOVE 5,.(3)
YLC2: FSBR 5,.(2) ;DY←YLCOR[IV2]-YLCOR[IV2-1]
PUSH P,4
PUSH P,5
FMPR 4,4
FMPR 5,5
FADR 4,5
PUSH P,4
PUSHJ P,SQRT
MOVE 6,LL
RLN1: MOVEM 1,.(6) ;RLEN[LL]←SQRT(DX↑2+DY↑2)
PUSHJ P,ANGDIR
MOVE 6,LL
ANG1: MOVEM 1,.(6) ;ANGARG[LL]←ANGDIR(DX,DY)
SUB P,[XWD 2,2]
JRST @2(P)
; Measures distance (signed) from (X,Y) to line L.
LDIST: MOVE 2,-1(P)
CXL3: MOVE 1,.(2)
FMPR 1,-3(P)
CYL3: MOVE 3,.(2)
FMPR 3,-2(P)
CCL3: FADR 1,.(2)
FADR 1,3
SUB P,[XWD 4,4]
JRST @4(P)
; DNEW, MALI
;COMPUTES MEAN DISTANCE FROM PROJECTED LINE TO NEW POINT-PAIR
DNEW: SOS 2,-4(P)
EAX6: MOVE 1,.(2)
FMPR 1,-3(P)
EAY6: MOVE 3,.(2)
FMPR 3,-2(P)
FADR 1,3
FADR 1,-1(P)
MOVMS 1
EBX3: MOVE 3,.(2)
FMPR 3,-3(P)
EBY3: MOVE 4,.(2)
FMPR 4,-2(P)
FADR 3,4
FADR 3,-1(P)
MOVMS 3
FADR 1,3
FSC 1,-1
SUB P,[XWD 5,5]
JRST @5(P)
; FINDS EQUATION AND OTHER INFORMATION FOR INSERTED LINE LL
MALI: HRLZI 6,-5(P)
BLT 6,4
MOVE 5,
LSH 5,1 ;IV2
MOVEI 6,-1(5) ;IV2-1
XLC4: MOVEM 1,(6)
YLC4: MOVEM 2,(6)
XLC5: MOVEM 3,(5)
YLC5: MOVEM 4,(5)
POP P,RET
MOVE 5,
CXL2: MOVEI 1,.(5)
PUSH P,1
CYL2: MOVEI 1,.(5)
PUSH P,1
CCL2: MOVEI 1,.(5)
PUSH P,1
PUSHJ P,LEKV
PUSH P,RET
JRST ANGLEN
; WEIFAI
;PART OF WEIGHV PROCEDURE
EXTERNAL W, CX, CY, CL
WEIFAI: MOVE 1,-1(P)
AOS 1
LSH 1,-1 ;LL←(ISV+1)%2
MOVEM 1,LL#
RLN2: PUSH P,.(1)
PUSHJ P,SQRT
MOVEM 1,W ;W ← SQRT(RLEN[LL])
MOVE 1,LL
CXL1: MOVE .(1)
MOVEM CX
CYL1: MOVE .(1)
MOVEM CY
CCL1: MOVE .(1)
MOVEM CL
MOVE 1,-1(P)
XLC3: MOVE .(1)
FMPR W
FADRM SX
YLC3: MOVE .(1)
FMPR W
FADRM SY
SUB P,[XWD 2,2]
JRST @2(P)
; LININT
;INITIALIZE ARRAY ADDRESS FOR LINE-VERTEX STRUCTURE
LININT: SOS 1,-7(P) ;MAKE ALL ADDRESS RELATIVE TO INDEX 0
HRRM 1,CXL1
HRRM 1,CXL2
HRRM 1,CXL3
HRRM 1,CXL4
SOS 1,-6(P)
HRRM 1,CYL1
HRRM 1,CYL2
HRRM 1,CYL3
HRRM 1,CYL4
SOS 1,-5(P)
HRRM 1,CCL1
HRRM 1,CCL2
HRRM 1,CCL3
SOS 1,-4(P)
HRRM 1,ANG1
SOS 1,-3(P)
HRRM 1,RLN1
HRRM 1,RLN2
SOS 1,-2(P)
HRRM 1,XLC1
HRRM 1,XLC2
HRRM 1,XLC3
HRRM 1,XLC4
HRRM 1,XLC5
HRRM 1,XLC6
HRRM 1,XLC7
SOS 1,-1(P)
HRRM 1,YLC1
HRRM 1,YLC2
HRRM 1,YLC3
HRRM 1,YLC4
HRRM 1,YLC5
HRRM 1,YLC6
HRRM 1,YLC7
SUB P,[XWD 10,10]
JRST @10(P)
; PLDIS
; Finds the shortest squared distance, R, from point (X,Y) to
; line I, and the corresponding coordinates, (XL,YL), on the
; line. IW ← 1 (else 0) iff (XL,YL) is outside the line segment.
; This routine is used in the insertion package. Assumes the
; topological connectivity as reflected in the line-coordinates.
AK←0
IV←1
XC←2
YC←3
CYY←4
X←5
Y←6
I←7
XL←10
YL←11
PLDIS: MOVE X,-7(P)
MOVE Y,-6(P)
MOVE I,-5(P)
SETZM @-1(P)
MOVEI IV,(I)
ASH IV,1
SUBI IV,1
MOVE AK,[1000.0]
CYL4: MOVE CYY,.(I)
XLC6: MOVE XC,.(IV)
YLC6: MOVE YC,.(IV)
JUMPE CYY,.+3
CXL4: MOVN AK,.(I) ;IF CY≠0
FDVR AK,CYY ;THEN AK←-CXL[I]/CY
MOVE YL,AK
FMPR YL,Y
FSBR YL,XC
FADR YL,X
FMPR YL,AK
FADR YL,YC
MOVE 13,AK
FMPR 13,13
FADR 13,[1.0]
FDVR YL,13 ;YL←(YC+AK*(AK*Y-XC+X))/(1.0+AK↑2)
MOVE XL,Y
FSBR XL,YL
FMPR XL,AK
FADR XL,X ;XL ← X+AK*(Y-YL)
; PLDIS CONT.
MOVE 13,X
FSBR 13,XL
FMPR 13,13
MOVE 14,Y
FSBR 14,YL
FMPR 14,14
FADR 13,14
MOVEM 13,@-2(P) ;R ← (X-XL)↑2+(Y-YL)↑2
AOS IV ;IV+1
MOVMS AK
CAMLE AK,[1.0]
JRST XLC7+2
MOVE 13,XL
FSBR 13,XC
MOVE 14,XL
XLC7: FSBR 14,.(IV)
JRST YLC7+1
MOVE 13,YL
FSBR 13,YC
MOVE 14,YL
YLC7: FSBR 14,.(IV)
FMPR 13,14
CAMGE 13,[-1.0]
JRST .+3
MOVEI 13,1
MOVEM 13,@-1(P)
MOVEM XL,@-4(P)
MOVEM YL,@-3(P)
SUB P,[XWD 10,10]
JRST @10(P)
END